const express = require('express')
const router = require('./router')

const app = express()

const myLogger = (req) => {
    console.log(req.method, req.url, Date.now())
}

// 中间件的顺序很重要
app.use((req, res, next) => { // next为进入下一个中间件
    console.log(req.method, req.url, Date.now())
    next() // 调用下一个匹配的中间件
})

// 不做任务限制的中间件
app.use(function (req, res, next) {
    console.log('不做任务限制的中间件')
    next()
})

// 限定请求路径的中间件
app.use('/user/:id', function (req, res, next) {
    console.log(`请求路径：${req.url}, 请求方法：${req.method}`)
    next()
})
// 限定请求方法 + 请求路径的中间件
app.get('/user/:id', function (req, res, next) {
    console.log(`请求路径：${req.url}, 请求方法：${req.method}`)
    next()
})


app.get('/', (req, res) => {
    res.send('get /')
})

app.get('/about', (req, res) => {
    res.send('get /about')
})

app.post('/login', (req, res) => {
    res.send('post /login')
})

// // 挂载路由
// app.use(router)

// 给路由设置访问前缀
app.use('/abc', router)

// 在所有的中间件之后挂载错误处理中间件
// 错误处理中间件始终带有4个参数，必须提供4个参数以将其标识为错误处理中间件
// 即使不需要使用next对象，也必须指定它以维护签名。否则，该next对象将被解释为常规中间件
app.use((err, req, res, next) => {
    console.error(err.stack)
    res.status(500).send('Something broke!')
})

app.listen(3000, () => {
    console.log('Server running at http://localhost:3000/')
})